from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
from django.contrib.auth.models import PermissionsMixin
from django.db import models
import uuid


class UserManager(BaseUserManager):
    """
    使用用户管理器
    """

    def create_user(self, username, password=None, **extra_fields):
        if not username:
            raise ValueError("The Username field must be set")

        # 设置默认字段，确保逻辑清晰
        extra_fields.setdefault('is_active', True)
        extra_fields.setdefault('is_host', False)

        # 自动生成 user_id
        # 使用 uuid4 生成随机的 user_id
        # TODO: 考虑后面将user_id的生成方式改为区块链相关联的方式
        user = self.model(username=username, user_id=uuid.uuid4().hex, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, username, password=None, **extra_fields):
        extra_fields.setdefault('is_host', True)
        extra_fields.setdefault('is_superuser', True)

        # 强制校验超级用户必须有 is_staff 和 is_superuser 权限
        if extra_fields.get('is_host') is not True:
            raise ValueError("Superuser must have is_host=True.")
        if extra_fields.get('is_superuser') is not True:
            raise ValueError("Superuser must have is_superuser=True.")

        return self.create_user(username, password, **extra_fields)


"""
AbstractBaseUser 是 Django 的基础用户类，提供了基本的用户认证功能（如密码设置和校验）。
由于没有 username、email 等字段，可以自由定义所需的字段（如 username 和 user_id）。

PermissionsMixin 提供了一些权限相关的功能，比如 is_superuser 字段和权限组支持。
这使得自定义用户模型可以与 Django 的权限系统集成，管理权限和角色。
"""


class Users(AbstractBaseUser, PermissionsMixin):
    user_id = models.CharField(max_length=50, primary_key=True, editable=False, unique=True)
    username = models.CharField(max_length=100, unique=True)
    # 用户昵称，可以重复
    nickname = models.CharField(max_length=100, unique=False)
    password = models.CharField(max_length=128)  # 使用 Django 推荐的长度，便于兼容加密算法
    is_active = models.BooleanField(default=True)
    is_host = models.BooleanField(default=False)

    objects = UserManager()

    # username：用作用户登录的唯一标识字段（指定为 USERNAME_FIELD），确保在系统中每个用户的 username 是唯一的。
    # 并且指定了哪个字段是用来登录的
    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = []

    def __str__(self):
        return self.username
